今天的題目來自於 MemLabs,這是一個用於教學的 CTF 挑戰,旨在鼓勵學生、安全研究人員以及 CTF 玩家入門記憶體鑑識領域。
那網路上大部分找到的 MemLabs 都是用 Volatility2 來做解題的,今天我們用 Volatility3 解看看~
pslist
看看有那些 process 正在執行中,可以注意到 notepad.exe 這個程式
vol -f .\MemoryDump_Lab3.raw windows.pslist
cmdline
看 process 執行的參數,在桌面上有一個 python 檔和一個文字檔filescan
居然找不到這兩個檔案
vol -f .\MemoryDump_Lab3.raw windows.filescan | grep evilscript.py
vol -f .\MemoryDump_Lab3.raw windows.filescan | grep vip.txt
filescan
是用 signature-based carving(基於結構體特徵值的掃描),直接在整個記憶體影像中搜尋 FILE_OBJECT 的特徵(magic 值 + 偏移結構對齊),因此,即使該物件已經被解除映射(unlinked / freed),只要記憶體還留有痕跡,它還是能掃到殘留的 FILE_OBJECT。windows.filescan
則多依賴 Windows kernel object table 與更嚴謹的物件驗證邏輯(解析 metadata),只列出「目前仍被 kernel 管理的合法 FILE_OBJECT」。memmap
直接把整個 process dump 下來
vol -f .\MemoryDump_Lab3.raw windows.memmap --pid 3432
strings -a pid.3432.dmp > 3432.txt
strings -a pid.3432.dmp | grep -i "evilscript.py"
strings -a .\dump\pid.3432.dmp | grep -i "vip.txt"
import string
import base64
def xor(s):
a = ''.join(chr(ord(i)^3) for i in s)
return a
def decoder(x):
base64_bytes = x.encode("ascii")
sample_string_bytes = base64.b64decode(base64_bytes)
return sample_string_bytes.decode("ascii")
if __name__ == "__main__":
c = "am1gd2V4M20wXGs3b2U="
c = xor(decoder(c))
print(c)
vol -f MemoryDump_Lab3.raw windows.filescan | grep -i ".png\|.jpg\|.jpeg\|.bmp"
vol -f MemoryDump_Lab3.raw windows.dumpfile --physaddr 0x4f34148
steghide info suspision1.jpeg
steghide info ../suspision1.jpeg -p inctf{0n3_h4lf
steghide extract -sf ../suspision1.jpeg -p inctf{0n3_h4lf
今天在 dumpfile 那邊卡了好久,原來 Volatility2 和 Volatility3 的 filescan 作法不一樣,所以才會說這兩個版本都建議下載來用,有些情況 2 比較好,但有些情況 3 比較好,不過那個部分也可以用 Volatility2 先掃描出他的位址後,再用 Volatility3 dump 下來。
希望今天大家都有學廢喔!